package com.info.zhiduoduo.core.service;

import com.info.zhiduoduo.common.constants.SmartResult;
import com.info.zhiduoduo.common.formbean.BaseSimpleFormBean;
import com.info.zhiduoduo.core.formbean.CalcProjectChargesFormBean;
import com.info.zhiduoduo.core.formbean.CheckProjectAmountFormBean;
import com.info.zhiduoduo.repository.dto.maker.MakerYearAmountDto;
import com.info.zhiduoduo.repository.dto.maker.StudioDetailDto;
import com.info.zhiduoduo.repository.dto.project.*;
import com.info.zhiduoduo.repository.dto.quota.CompanyQuotaDto;
import com.info.zhiduoduo.repository.dto.quota.MakerQuotaDto;
import com.info.zhiduoduo.repository.dto.quota.ZhiduoduoCityQuotaDto;
import com.info.zhiduoduo.repository.entity.company.CompanyProject;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface CoreProjectService {

	/**
	 * 判断当前创客的年度、季度、月度、过去12个月限额、城市限额等条件，都满足就通过，如果其中一个没通过，则报错。
	 *
	 * @param compid            企业id
	 * @param userid            创客id
	 * @param projectid         需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType       项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param currProjectAmount 当前要发布的项目金额
	 * @param calcAmountType    计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 */
	void checkMakerQuota(int compid, int userid, int projectid, int projectType, BigDecimal currProjectAmount, int calcAmountType);

	/**
	 * 判断当前创客的年度、季度、月度、过去12个月限额、城市限额等条件，都满足就通过，如果其中一个没通过，则报错。
	 *
	 * @param compid            企业id
	 * @param userid            创客id
	 * @param projectid         需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType       项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param currProjectAmount 当前要发布的项目金额
	 * @param calcAmountType    计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param checkCityQuota    是否需要检查城市限额
	 */
	void checkMakerQuota(int compid, int userid, int projectid, int projectType, BigDecimal currProjectAmount,BigDecimal makerProjectAmount, int calcAmountType,
	                     boolean checkCityQuota);

	/**
	 * 判断当前创客所有进行中，已完成的项目总金额是否已经超过了系统年度限额、过去12个月限额、企业年度限额、创客年度限额、城市年度限额
	 *
	 * @param companyQuota
	 * @param makerQuota
	 * @param cityQuota
	 * @param currProjectAmount 当前要发布的项目金额
	 * @param calcAmountType    计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return true：已超过年度限额 false：否
	 */
	boolean checkUserTotalAmountExceedYearlyQuota(CompanyQuotaDto companyQuota, MakerQuotaDto makerQuota, ZhiduoduoCityQuotaDto cityQuota,
	                                              int projectid, int projectType, BigDecimal currProjectAmount, int calcAmountType);

	/**
	 * 判断当前创客所有进行中，已完成的项目总金额是否已经超过了企业、创客、城市季度限额
	 *
	 * @param companyQuota
	 * @param makerQuota
	 * @param cityQuota
	 * @param currProjectAmount 当前要发布的项目金额
	 * @param calcAmountType    计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return true：已超过年度限额 false：否
	 */
	boolean checkUserTotalAmountExceedQuarterlyQuota(CompanyQuotaDto companyQuota, MakerQuotaDto makerQuota,
	                                                 ZhiduoduoCityQuotaDto cityQuota, int projectid, int projectType,
	                                                 BigDecimal currProjectAmount, int calcAmountType);

	/**
	 * 判断当前创客所有进行中，已完成的项目总金额是否已经超过了企业、创客、城市月度限额
	 *
	 * @param companyQuota
	 * @param makerQuota
	 * @param cityQuota
	 * @param currProjectAmount 当前要发布的项目金额
	 * @param calcAmountType    计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return true：已超过年度限额 false：否
	 */
	boolean checkUserTotalAmountExceedMonthlyQuota(CompanyQuotaDto companyQuota, MakerQuotaDto makerQuota, ZhiduoduoCityQuotaDto cityQuota,
	                                               int projectid, int projectType, BigDecimal currProjectAmount, int calcAmountType);

	/**
	 * 判断当前创客发单金额是否已经超过了企业、创客、城市单笔限额
	 *
	 * @param companyQuota
	 * @param makerQuota
	 * @param cityQuota
	 * @param currProjectAmount 当前要发布的项目金额
	 * @return true：已超过年度限额 false：否
	 */
	boolean checkUserTotalAmountExceedSingleQuota(CompanyQuotaDto companyQuota, MakerQuotaDto makerQuota, ZhiduoduoCityQuotaDto cityQuota,
	                                              int projectid, int projectType, BigDecimal currProjectAmount);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目(不含税金额),纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmount(int userid, int calcAmountType);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目(不含税金额),纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmount(int userid, int calcAmountType, int year);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目(不含税金额),纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid             创客id
	 * @param calcAmountType     计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param includeEntrustment 是否包含委托发单/创客团项目
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmount(int userid, int calcAmountType, boolean includeEntrustment);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目(不含税金额),纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmount(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目(不含税金额),纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param year
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmount(int userid, int calcAmountType, int projectid, int projectType, int year);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,纯代理( )项目,支付宝委托发单项目（不包含众包金额）
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmountExcludeCrowdsource(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目（不包含委托发单项目）
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmountExcludeEntrusment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前年度项目总金额。包括 项目,纯代理( )项目（不包含众包项目/支付宝委托发单项目）
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserYearlyTotalAmountExcludeCrowdsourceEntrusment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客过去12个月项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserTwelveMonthTotalAmount(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客过去12个月项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,不含委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id， 开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserTwelveMonthTotalAmountExcludeEntrusment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前季度项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	BigDecimal getUserQuarterTotalAmount(int userid, int calcAmountType);

	/**
	 * 获取创客当前季度项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param quarter        当前季度, 1-4
	 * @return
	 */
	BigDecimal getUserQuarterTotalAmountByYearQuarter(int userid, int calcAmountType, int year, int quarter);

	/**
	 * 获取创客当前季度进行中、已完成的项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserQuarterTotalAmount(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前季度进行中、已完成的项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,不含支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserQuarterTotalAmountExcludeEntrustment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客当前季度已验收、已完成的项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid             创客id
	 * @param calcAmountType     计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param includeEntrustment 是否包含委托发单/创客团项目
	 * @return
	 */
	BigDecimal getUserQuarterTotalAmount(int userid, int calcAmountType, boolean includeEntrustment);

	/**
	 * 获取创客当前季度已验收、已完成的项目总金额。包括 项目,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param year           当前年份
	 * @param quarter        当前季度,1-4
	 * @return
	 */
	BigDecimal getUserQuarterGenTotalAmountByYearQuarter(int userid, int calcAmountType, int year, int quarter);

	/**
	 * 获取创客当前季度已验收、已完成的项目总金额。包括 项目,智众包项目（不含税金额）,纯代理( )项目,不含支付宝委托发单项目
	 *
	 * @param userid         创客id
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid      当前需要排除的projectid
	 * @param projectType    项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @return
	 */
	BigDecimal getUserQuarterGenTotalAmountExcludeEntrustment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取当前创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmount(int userid);

	/**
	 * 获取当前创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmount(int userid, int calcAmountType);

	/**
	 * 获取当前创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid       项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmount(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目,支付宝委托发单项目
	 *
	 * @param userid
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmountByYearMonth(int userid, int calcAmountType, int year, int month);

	/**
	 * 获取创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目，支付宝委托发单项目
	 *
	 * @param userid
	 * @param calcAmountType     计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param includeEntrustment 是否包含委托发单/创客团项目
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmount(int userid, int calcAmountType, int year, int month, boolean includeEntrustment);

	/**
	 * 获取创客本月的项目总金额, 包括 项目,智众包项目,纯代理( )项目，不包含委托发单项目
	 *
	 * @param userid
	 * @param calcAmountType     计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid
	 * @return
	 */
	BigDecimal getUserMonthlyTotalAmountExcludeEntrustment(int userid, int calcAmountType, int projectid, int projectType);

	/**
	 * 获取创客本月的项目总金额, 包括 项目,智众包项目(含税金额),纯代理( )项目，委托发单项目
	 * @param userid
	 * @param calcAmountType     计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @param projectid           项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType        项目类型, 0表示全部. 参考: {@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param year
	 * @param month
	 * @param includeCrowdsource
	 * @param includeEntrustment
	 * @return
	 */
	BigDecimal getUserMonthlyGenTotalAmount(int userid, int calcAmountType, int projectid, int projectType, int year, int month,
	                                        boolean includeCrowdsource, boolean includeEntrustment);

	/**
	 * 检查当前企业给此创客的项目总金额和该创客全部项目总金额是否正好超过各分界限额。
	 *
	 * @param formBean
	 * @return
	 */
	SmartResult<CheckProjectAmountDto> checkCompanyUserTotalAmount(BaseSimpleFormBean<CheckProjectAmountFormBean> formBean);

	/**
	 * 检查当前企业给此创客的项目总金额和该创客全部项目总金额是否正好超过各分界限额。
	 *
	 * @param formBean
	 * @return
	 */
	CheckProjectAmountDto checkCompanyUserTotalAmount(CheckProjectAmountFormBean formBean);

	/**
	 * 批量检查企业项目总金额和该创客全部项目总金额是否超过各分界限额。
	 *
	 * @param list
	 * @return
	 */
	List<CheckProjectAmountDto> batchCheckCompanyUserTotalAmount(List<CompanyProject> list);

	/**
	 * 检查当前创客项目总金额所在的费率区间及是否正好超过各分界限额。
	 *
	 * @param formBean
	 * @return
	 */
	SmartResult<AlertUserProjectAmountDto> checkUserTotalAmount(BaseSimpleFormBean<CheckProjectAmountFormBean> formBean);

	/**
	 * 计算项目需要的服务费和税费
	 * <p> 根据dealded 确定采用projectdealamount还是projectamount来参与计算
	 *
	 * @param formBean
	 * @return
	 */
	CalcProjectChargesDto calcProjectCharge(CalcProjectChargesFormBean formBean);

	/**
	 * 计算 开票的服务费
	 *
	 * @param studio            创客或 创客工作室，
	 * @param compid           企业id,如果project=null,则使用compid获取所有合伙人费率
	 * @param projectid        需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType      1: 项目 7:创客团- 项目; 参考{@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param isSpecialInvoice true:专票 false:普票
	 * @param dealAmount       当前项目的成交金额
	 * @param calcAmountType   计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	ProjectServiceChargeDto calcStudioServiceCharge(StudioDetailDto studio, int compid, int projectid, int projectType,
	                                                boolean isSpecialInvoice, BigDecimal dealAmount, int calcAmountType);

	/**
	 * 获取创客的基础服务费率
	 *
	 * @param studio            创客或 创客工作室，
	 * @param projectid        需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType      1: 项目 7:创客团- 项目; 参考{@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param isSpecialInvoice true:专票 false:普票
	 * @param dealAmount       当前项目的成交金额
	 * @param calcAmountType   计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	double getMakerBaseServiceRate(StudioDetailDto studio, int projectid, int projectType, boolean isSpecialInvoice, BigDecimal dealAmount,
	                               int calcAmountType);

	/**
	 * 计算 工作室税费，如果此季度总项目费用超过了限额，则按高费率的计算。
	 *
	 * @param studio            创客或 工作室
	 * @param projectid        需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType      参考{@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param isSpecialInvoice true:专票 false:普票
	 * @param dealAmount       当前项目的成交金额
	 * @param calcAmountType   计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	ProjectTaxFeeDto calcStudioTaxFee(StudioDetailDto studio, int projectid, int projectType, boolean isSpecialInvoice,
	                                  BigDecimal dealAmount, int calcAmountType);

	/**
	 * 获取创客的基础服务费率
	 *
	 * @param studio            创客或 创客工作室，
	 * @param projectid        需要排除的项目id： 项目id，智众包大项目id，委托接单、创客团子项目id,  开票id
	 * @param projectType      1: 项目 7:创客团- 项目; 参考{@link com.info.zhiduoduo.common.constants.project.ProjectType}
	 * @param isSpecialInvoice true:专票 false:普票
	 * @param dealAmount       当前项目的成交金额
	 * @param calcAmountType   计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	double getMakerBaseTaxRate(StudioDetailDto studio, int projectid, int projectType, boolean isSpecialInvoice, BigDecimal dealAmount,
	                           int calcAmountType);

	/**
	 * 检查当前项目和历史项目金额是否正好超过各阶段的分界值
	 *
	 * @param currYearlyTotalAmount   当前年度已交易的总金额
	 * @param currQuarterTotalAcmount 当前季度已交易的总金额
	 * @param projectAmount           当前正发布的金额
	 * @return 提醒类型：0：无 1：正好超过季度30万 2：正好超过全年75万 3：正好超过全年150万 4：正好超过全年300万 5：正好超过全年500万
	 */
	int checkTotalAmountJustExceedType(double currYearlyTotalAmount, double currQuarterTotalAcmount, double projectAmount);

	/**
	 * 检查当前项目和历史项目金额在哪个分界区间内
	 *
	 * @param currYearlyTotalAmount   当前年度已交易的总金额
	 * @param currQuarterTotalAcmount 当前季度已交易的总金额
	 * @param projectAmount           当前正发布的金额
	 * @return 类型：0：季度低于30万 1：超过季度30万 2：超过全年75万 3：超过全年150万 4：超过全年300万 5：超过全年500万
	 */
	int checkTotalAmountType(double currYearlyTotalAmount, double currQuarterTotalAcmount, double projectAmount);

	SmartResult<ProjectDto> getUserLastProject(BaseSimpleFormBean<String> formBean);

	/**
	 * 同一个企业同一个创客 当天内相同的金额转出： 项目
	 * @param projectIds 	项目ID
	 * @param compid		企业ID
	 * @return 没有相同的则返回空，有的话返回相同数据（创客姓名，交易金额）
	 */
	List<SameProjectDto> getTimeSameZddTradeAmount(String projectIds, Integer compid);

	/**
	 * 同一个企业同一个创客 当天内相同的金额转出：智众包项目
	 * @param projectIds 	项目ID
	 * @param compid		企业ID
	 * @return 没有相同的则返回空，有的话返回相同数据（创客姓名，交易金额）
	 */
	List<SameProjectDto> getTimeSameCroTradeAmount(String projectIds, Integer compid);

	/**
	 * 打款给同一个自然人 当天内相同的金额转出：委托接单项目
	 * @param projectIds 	项目ID
	 * @return 没有相同的则返回空，有的话返回相同数据（自然人姓名，交易金额）
	 */
	List<SameProjectDto> getTimeSameEntTradeAmount(String projectIds);

	/**
	 * 验证企业账户余额是否足够支付企业项目金额。根据账户选择的支付方式,判断九歌统一账户或企业商户号账户的余额是否足够.
	 *
	 * @param compid
	 * @param projectAmount
	 * @return
	 */
	SmartResult checkCompanyAccountForProject(int compid,Integer payId, BigDecimal projectAmount);

	BigDecimal getTotalAmountByCompids(String compids, Date from, Date to);

	BigDecimal getTotalAmountByUserid(int userid, Date from, Date to);

	/**
	 * 查询创客项目交易金额 包含(进行中、验收中、已验收、已完成)项目类型： 、智众包、委托接单、创客团
	 * @param userid
	 * @param from
	 * @param to
	 * @return
	 */
	BigDecimal getTotalAmountByUserId(int userid, Date from, Date to);

	/**
	 * 获取创客年度所有的金额数据 返回对象
	 *
	 * @param userid
	 * @param calcAmountType
	 * @param year
	 * @return
	 */
	MakerYearAmountDto getUserYearAmounts(int userid, int calcAmountType, int year);

	/**
	 * 查询个人所有业务（自然人+创客，一个人拥有多个工作室的身份证号码后面会有off，或offoff，在识别同一个人的时候，有off的身份证号的创客交易额也要统计进去）
	 * 总项目交易金额 项目类型： 、智众包、纯代理、智零工（智众包和智零工统计不含税金额，也就是实际到手金额）、委托接单、创客团
	 * 同一个身份证号自然年或者连续12个月总交易额<=480万
	 * @param idno 身份证号
	 * @param timeType 时间类型：0：自然年，1：12个月总交易额
	 * @return
	 */
	BigDecimal getTotalAmountByUserIdno(String idno, int projectid,int projectType, int calcAmountType, int timeType);
}
